<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JavaScript</title>
</head>
<body>
    <pre>
        ECMAScript：
        (14) 自定义函数
                根据业务需要，创建的函数。
                封装业务逻辑，在需要的地方调用即可，无需重复写代码。
            自定义函数的分类：
            (1)命名函数[函数声明]
                语法：
                    function关键字 函数名(参数列表){
                        函数体:写业务逻辑的
                    }
                    关键字：不能改，区分大小写
                    函数名：驼峰命名法，见名知意
                    参数列表：
                        定义时：            形参
                            参数名,参数名
                        调用时：            实参 
                            值,值
                        推荐：形参和实参的个数、类型、顺序保持一致
                    函数体：写JS支持的任意逻辑代码
                           如果函数有返回结果，就写return 值;
                调用函数：
                   函数名(参数)
                注意：
                   函数不会默认调用事件，必须手动调用
                   函数只能返回一个变量值。
                   定义时的参数列表只写参数名，不用写var

            (2)匿名函数[函数表达式]
                语法：
                    var 变量名 = function关键字(参数列表){
                        函数体:写业务逻辑的
                    }
                调用函数：
                    变量名(参数)
                注意事项同上。  

            (3)动态函数
                    参数和逻辑都以字符串方式作为"参数"传递到动态函数中，动态函数没有函数体
                语法：
                    var 变量名 = new Function("参数","参数","逻辑代码");
                调用：
                    变量名(值,值);
                注意：
                    逻辑代码必须写在最后一个参数里
                    调用时传递的值可以是JS支持的任意类型，只是定义时的语法要求参数比较加引号而已

            函数自调用：
                (1)匿名函数自调用
                    var bl = function(){}
                    //bl();
                    (function(){})()
                (2)命名函数自调用
                    function name(){}
                    //name();
                    (function name(){})()
            
            函数的数据类型：
                (1)函数本身也是数据，类型是function，可以通过typeof获取
                (2)函数的参数列表可以接收js支持的所有类型[包括函数本身]
            函数的返回结果类型：
                (1)函数本身也是数据，类型是function，可以通过typeof获取
                (2)函数的返回结果可以是js支持的所有类型[包括函数本身]

            回调函数： 
                (1)函数A作为参数传递到另一个函数B中，并且函数B执行函数A。那么函数A叫做函数B的回调函数
                (2)函数A作为另一个函数B的返回结果，那么函数A叫做函数B的回调函数

            作用域：作用域就是在这一个区域内有作用（使用范围）
            分类：
                    全局作用域  整个js都能使用
                    块级作用域  在除函数以外的任意{}内可使用
                    局部作用域  在函数内使用
            变量作用域中的var是定义全局变量，仅可以提升块级作用域到全局作用域，对局部作用域无效
            注意： 
                 函数可以嵌套。
                 1、局部变量在函数运行以后被删除  
                 2、显示全局变量在页面关闭后被删除
                    隐式全局变量既可以在页面关闭后被删除，也可以通过delete手动删除

            作用域链：
                有多个作用域[全局/块级/局部]，并且作用域有重叠覆盖，称为作用域链。
            特点：
                作用域范围越小，优先级越高。
                从范围最小的开始往上找，找不到才报错

            预解析：
                在定义声明之前就可以使用的一种方式。
                
    </pre>
    <button onclick="method1()">点击触发method1</button>
    <script type="text/javascript" src="js/chapter8.js"></script>
</body>
</html>